package com.shujia.zookeeper;

import org.apache.hadoop.fs.Path;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;

import java.io.IOException;
import java.util.List;

/**
 * 需求：迭代删除路径
 * <p>
 * 1.如果给定一个路径 需要判断有无子节点
 * 如果有子节点  获取子节点名称，递归调用自身函数
 * 如果没有子节点  直接删除 同时需要再删除父节点
 * 直到父节点和初始节点一致停止
 */
public class Code07DeleteAll {
    public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
        ZooKeeper zooKeeper = new ZooKeeper("master:2181,node1:2181,node2:2181"
                , 10 * 1000
                , new Watcher() {
            @Override
            // 该方法在Zookeeper连接中会被触发两次，一次在建立连接时，另外一次在关闭连接时
            // 该方法执行时，是按照异步执行
            public void process(WatchedEvent event) {
                System.out.println("当前Zookeeper连接被触发...");
            }
        }
        );

        // 需要迭代删除的路径
        String startPath = "/t1";

        deleteAllPath(startPath, zooKeeper,startPath);

    }

    public static void deleteAllPath(String startPath, ZooKeeper zooKeeper,String judgePath) throws InterruptedException, KeeperException {
        // 1.先判断节点是否存在

        Stat exists = zooKeeper.exists(startPath, false);
        if (exists != null) {
            // 节点存在时，可以获取其子节点
            List<String> children = zooKeeper.getChildren(startPath, false, exists);
            System.out.println(children);
            // 当子节点数量为0时，表示无子节点
            if (children.size() == 0) {
                // 当没有子节点时，直接删除节点
                zooKeeper.delete(startPath, -1);
                // 当删除的路径不是最开始的路径，那么需要往上回溯父路径进行删除
                if(!judgePath.equals(startPath)){
                    Path path = new Path(startPath);
                    Path parent = path.getParent();
                    deleteAllPath(parent.toString(),zooKeeper,judgePath);
                }
            } else {
                // 如果有子节点，那么需要拼接子节点路径
                for (String child : children) {
                    String childPath = startPath + "/" + child;
                    // 当子节点存在时，调用自身函数进行判断删除
                    deleteAllPath(childPath,zooKeeper,judgePath);
                }
            }
        }

    }
}
